package com.colin.library.help;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class TimeHelp {
/**
 SimpleDateFormat函数语法：

 G 年代标志符
 y 年
 M 月
 d 日
 h 时 在上午或下午 (1~12)
 H 时 在一天中 (0~23)
 m 分
 s 秒
 S 毫秒
 E 星期
 D 一年中的第几天
 F 一月中第几个星期几
 w 一年中第几个星期
 W 一月中第几个星期
 a 上午 / 下午 标记符
 k 时 在一天中 (1~24)
 K 时 在上午或下午 (0~11)
 z 时区
 */
    /**
     * 获取当前时间
     *
     * @return
     */
    public static String getCurrentlyTime() {

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.getDefault());
        return getTimeString(simpleDateFormat, System.currentTimeMillis());
    }

    /**
     * @param simpleDateFormat 时间格式
     * @return
     */
    public static String getCurrentlyTime(SimpleDateFormat simpleDateFormat) {
        return getTimeString(simpleDateFormat, System.currentTimeMillis());
    }

    /**
     * @param time 时间戳
     * @return
     */
    public static String getTimeString(long time) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.getDefault());
        return getTimeString(simpleDateFormat, time);
    }

    /**
     * @param format 时间格式
     * @param time   时间戳
     * @return
     */
    public static String getTimeString(String format, long time) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, Locale.getDefault());
        return getTimeString(simpleDateFormat, time);
    }


    /**
     * 返回时间字符串
     *
     * @param simpleDateFormat 时间格式化
     * @param timestamp        时间戳
     * @return
     */
    public static String getTimeString(SimpleDateFormat simpleDateFormat, long timestamp) {
        return simpleDateFormat.format(new Date(timestamp));
    }

    /**
     * 根据时间字符串变成时间戳
     *
     * @param time_string
     * @return
     */
    public static long getTimeStamp(String time_string) {
        return getTimeStamp("yyyy年MM月dd日 HH:mm", time_string);
    }

    public static long getTimeStamp(String format, String time_string) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, Locale.getDefault());
        return getTimeStamp(simpleDateFormat, time_string);
    }

    public static long getTimeStamp(SimpleDateFormat simpleDateFormat, String time_string) {
        Date date = null;
        try {
            date = simpleDateFormat.parse(time_string);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
        long timeStamp = date.getTime();
        return timeStamp;
    }

    /**
     * 字符串变成Calendar
     *
     * @param time_string
     * @return
     */
    public static Calendar stringSwtchToCalendar(String time_string) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        Date date = null;
        Calendar calendar = Calendar.getInstance();
        if (!StringHelp.isEmpty(time_string)) {
            try {
                date = simpleDateFormat.parse(time_string);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        if (date != null) {
            calendar.setTime(date);
        } else {
            calendar.setTime(new Date());
        }
        return calendar;
    }
    // //////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 判断两个unix时间戳是否在同一天
     *
     * @param unixTime1
     * @param unixTime2
     * @return
     */
    public static boolean onTheSameDay(long unixTime1, long unixTime2) {
        Date dateStart = new Date(unixTime1);
        Date dateEnd = new Date(unixTime2);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
        String dateStringStart = dateFormat.format(dateStart);
        String dateStringEnd = dateFormat.format(dateEnd);
        if (dateStringStart.equals(dateStringEnd)) {
            return true;
        } else {
            return false;
        }
    }


    /**
     * 获取两个日期相差的日历天数（即，不考虑当天的具体时间） 例如，2013年5月15日23点4分与2013年5月16日0点30分，相差一天
     * Date类型精确到天 星期几 Calendar 格式化时间
     *
     * @param calendar1 减数
     * @param calendar2 被减数
     * @return calendar1 - calendar2
     */
    public static long DateDiff(Calendar calendar1, Calendar calendar2) {
        Calendar calendar1temp = Calendar.getInstance();
        calendar1temp.set(calendar1.get(Calendar.YEAR), calendar1.get(Calendar.MONTH),
                calendar1.get(Calendar.DAY_OF_MONTH));

        Calendar calendar2temp = Calendar.getInstance();
        calendar2temp.set(calendar2.get(Calendar.YEAR), calendar2.get(Calendar.MONTH),
                calendar2.get(Calendar.DAY_OF_MONTH));
        long datediff = (calendar1temp.getTimeInMillis() - calendar2temp.getTimeInMillis()) / (24 * 60 * 60 * 1000);

        return datediff;
    }

    /**
     * 消息在五秒以内
     *
     * @param sent_at
     * @param sent_at2
     * @return
     */
    public static boolean isCloseEnough(long sent_at, long sent_at2) {
        if (Math.abs(sent_at - sent_at2) < 5000) {
            return true;
        } else {
            return false;
        }
    }


    private final static double ONE_MINUTE = 60000;
    private final static double ONE_HOUR = ONE_MINUTE * 60;
    private final static double ONE_DAY = ONE_HOUR * 24;
    private final static double TWO_DAY = ONE_DAY * 2;
    private final static double THREE_DAY = ONE_DAY * 3;

    /**
     * 评论时间
     *
     * @param time
     * @return
     */
    public static String getCommontTime(Long time) {
        double residue_time = (double) (System.currentTimeMillis() - time);
        if (residue_time < ONE_MINUTE || time == 0) {
            return "刚刚";
        } else if (residue_time < ONE_HOUR) {
            int minute = (int) Math.ceil(residue_time / ONE_MINUTE);
            return String.valueOf(minute) + "分钟前";
        } else if (residue_time < ONE_DAY) {
            int hour = (int) Math.ceil(residue_time / ONE_HOUR);
            return String.valueOf(hour) + "小时前";
        } else if (residue_time < THREE_DAY) {
            return "昨天";
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);
            return getTimeString(sdf, time);
        }
    }


}
